%arbol(-A)
arbol(nil).
arbol(bin(Izq, _, Der)) :- arbol(Izq), arbol(Der).

%nodosEn(?A, +L)
nodosEn(nil, _).
nodosEn(bin(Izq, R, Der), L) :- member(R, L), nodosEn(Izq, L), nodosEn(Der, L).

%sacar(+X, +L, -LSinX)
sacar(X, [X|XS], XS).
sacar(X, [Y|YS], [Y|ZS]) :- X \= Y, sacar(X, YS, ZS).

%estaEn(+Arbol, +Elem)
estaEn(bin(_, R, _), Elem) :- Elem = R.
estaEn(bin(Izq, _, _), Elem) :- estaEn(Izq, Elem).
estaEn(bin(_, _, Der), Elem) :- estaEn(Der, Elem).

%sinRepetidosEntre(+Izq, +Der)
sinRepetidosEntre(nil, _).
sinRepetidosEntre(bin(IzqAb1, R, DerAb1), Ab2) :- not(estaEn(Ab2, R)), sinRepetidosEntre(IzqAb1, Ab2), sinRepetidosEntre(DerAb1, Ab2).

%sinRepEn(-A, +L)
sinRepEn(nil, _).
sinRepEn(bin(Izq, R, Der), L) :- member(R, L), sacar(R, L, LSinR), sinRepEn(Izq, LSinR), sinRepEn(Der, LSinR), sinRepetidosEntre(Izq, Der).

